package br.ufmt.model;

import java.util.Date;
import java.util.regex.Pattern;

import br.ufmt.exception.EnderecoException;
import br.ufmt.exception.PessoaException;

/**
 * Classe modelo para cria��o de qualquer tipo de conceito que esteja relacionado a Pessoas F�sicas e Jur�dicas
 * @author jppreti
 *
 */
public abstract class Pessoa {
	
	/**
	 * Nome completo de uma determinada pessoa
	 */
	protected String nome;
	/**
	 * Data em que a pessoa nasceu
	 */
	protected Date dataNascimento;
	/**
	 * Cadastro da pessoa f�sica na receita federal
	 */
	protected String cpf;
	/**
	 * Endere�o completo da pessoa
	 * @see locadora.Endereco
	 */
	protected Endereco endereco = new Endereco();

	/**
	 * telefone de contato da pessoa (comercial, residencial ou celular)
	 */
	protected String telefone;
	/**
	 * Sexo da pessoa
	 * @see locadora.SexoEnum
	 */
	protected SexoEnum sexo;
	
	public Pessoa() {
		try {
			this.setNome("");
		} catch (PessoaException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public Pessoa(String nome, Date dataNascimento, String cpf,
			String telefone, SexoEnum sexo) throws PessoaException {
		setNome(nome);
		setDataNascimento(dataNascimento);
		setCpf(cpf);
		setTelefone(telefone);
		setSexo(sexo);
	}

	public SexoEnum getSexo() {
		return sexo;
	}

	public void setSexo(SexoEnum sexo) throws PessoaException {
		if (sexo==null) throw new PessoaException(PessoaException.SEXO_OBRIGATORIO);
		this.sexo = sexo;
	}

	public String getNome() {
		return nome;
	}
	
	public Date getDataNascimento() {
		return dataNascimento;
	}
	
	public String getCpf() {
		return cpf;
	}
	
	public String getTelefone() {
		return telefone;
	}
	
	public String getLogradouro() {
		return endereco.getLogradouro();
	}
	
	public String getNumero() {
		return endereco.getNumero();
	}
	
	public String getBairro() {
		return endereco.getBairro();
	}
	
	public String getCep() {
		return endereco.getCep();
	}
	
	public String getComplemento() {
		return endereco.getComplemento();
	}
	
	public Cidade getCidade() {
		return endereco.getCidade();
	}
	
	/**
	 * Modifica o nome da pessoa
	 * @param nome
	 * @throws PessoaException
	 */
	public void setNome(String nome) throws PessoaException {
		if (nome==null || nome.length()==0) throw new PessoaException(PessoaException.NOME_OBRIGATORIO);
		if (nome.length()<5) throw new PessoaException(PessoaException.NOME_TAMANHO);
		this.nome = nome;
	}
	
	/**
	 * modifica a data de nascimento
	 * @param dataNascimento
	 * @throws PessoaException
	 */
	public void setDataNascimento(Date dataNascimento) throws PessoaException {
		if (dataNascimento==null) throw new PessoaException(PessoaException.DATA_NASCIMENTO_OBRIGATORIO);
		this.dataNascimento = dataNascimento;
	}
	
	/**
	 * Modifica o CPF
	 * @param cpf
	 * @throws PessoaException
	 */
	public void setCpf(String cpf) throws PessoaException {
		if (cpf==null || cpf.length()==0) throw new PessoaException(PessoaException.CPF_OBRIGATORIO);
		if (!Pattern.matches(ExpressoesRegulares.CPF, cpf)) throw new PessoaException(PessoaException.CPF_FORMATO);
		this.cpf = cpf;
	}
	
	/**
	 * Modifica o telefone
	 * @param telefone
	 * @throws PessoaException
	 */
	public void setTelefone(String telefone) throws PessoaException {
		if (telefone==null || telefone.length()==0) throw new PessoaException(PessoaException.TELEFONE_OBRIGATORIO);
		if (!Pattern.matches(ExpressoesRegulares.TELEFONE, telefone)) throw new PessoaException(PessoaException.TELEFONE_FORMATO);
		this.telefone = telefone;
	}
	
	/**
	 * Modifica o logradouro
	 * @param logradouro
	 * @throws EnderecoException
	 */
	public void setLogradouro(String logradouro) throws EnderecoException {
		endereco.setLogradouro(logradouro);
	}
	
	/**
	 * Modifica a n�mero da resid�ncia
	 * @param numero
	 * @throws EnderecoException
	 */
	public void setNumero(String numero) throws EnderecoException {
		endereco.setNumero(numero);
	}
	
	/**
	 * Modifica o bairro
	 * @param bairro
	 * @throws EnderecoException
	 */
	public void setBairro(String bairro) throws EnderecoException {
		endereco.setBairro(bairro);
	}
	
	/**
	 * Modifica o CEP
	 * @param cep
	 * @throws EnderecoException
	 */
	public void setCep(String cep) throws EnderecoException {
		endereco.setCep(cep);
	}
	
	/**
	 * Modifica o Complemento. � de preenchimento opcional.
	 * @param complemento
	 */
	public void setComplemento(String complemento) {
		endereco.setComplemento(complemento);
	}
	
	/**
	 * Modifica a cidade
	 * @param cidade
	 * @throws EnderecoException
	 */
	public void setCidade(Cidade cidade) throws EnderecoException {
		endereco.setCidade(cidade);
	}	

	@Override
	public String toString() {
		return getNome() + "\n" +
			   getDataNascimento() + "\n" +
			   getCpf() + "\n" +
			   endereco + "\n" +
			   getTelefone() + "\n";
	}
}


